package klotski;

import java.awt.Point;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;

public class ProtoBlock {

	public static int edge = 80;

	static int typeCount = 0;

	static int shapeUNIT[][] = { { 0, 1, 1, 0 }, { 0, 0, 1, 1 } };

	static int pieceUNIT[][] = { { 0, 0 } };

	final public static ProtoBlock UNIT = new ProtoBlock(shapeUNIT, pieceUNIT);

	static int shapeH2[][] = { { 0, 2, 2, 0 }, { 0, 0, 1, 1 } };

	static int pieceH2[][] = { { 0, 0 }, { 1, 0 } };

	public static ProtoBlock H2 = new ProtoBlock(shapeH2, pieceH2);

	static int shapeV2[][] = { { 0, 1, 1, 0 }, { 0, 0, 2, 2 } };

	static int pieceV2[][] = { { 0, 0 }, { 0, 1 } };

	public static ProtoBlock V2 = new ProtoBlock(shapeV2, pieceV2);

	static int shapeQUAD[][] = { { 0, 2, 2, 0 }, { 0, 0, 2, 2 } };

	static int pieceQUAD[][] = { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 1, 0 } };

	final public static ProtoBlock QUAD = new ProtoBlock(shapeQUAD, pieceQUAD);

	static int shapeL3[][] = { { 0, 1, 1, 2, 2, 0 }, { 0, 0, 1, 1, 2, 2 } };

	static int pieceL3[][] = { { 0, 0 }, { 0, 1 }, { 1, 1 } };

	public static ProtoBlock L3 = new ProtoBlock(shapeL3, pieceL3);

	static int shapel3[][] = { { 1, 2, 2, 0, 0, 1 }, { 0, 0, 2, 2, 1, 1 } };

	static int piecel3[][] = { { 1, 0 }, { 0, 1 }, { 1, 1 } };

	final public static ProtoBlock l3 = new ProtoBlock(shapel3, piecel3);

	static int shapeR3[][] = { { 0, 2, 2, 1, 1, 0 }, { 0, 0, 1, 1, 2, 2 } };

	static int pieceR3[][] = { { 0, 0 }, { 0, 1 }, { 1, 0 } };

	public static ProtoBlock R3 = new ProtoBlock(shapeR3, pieceR3);

	static int shaper3[][] = { { 0, 2, 2, 1, 1, 0 }, { 0, 0, 2, 2, 1, 1 } };

	static int piecer3[][] = { { 0, 0 }, { 1, 0 }, { 1, 1 } };

	public static ProtoBlock r3 = new ProtoBlock(shaper3, piecer3);

	
	static int shaperIT[][] = { { 1,2,2,3,3,0,0,1},
		                        { 0,0,1,1,2,2,1,1} };

	static int piecerIT[][] = { { 1,0 }, { 0,1 }, { 1, 1 },{2,1}};

	public static ProtoBlock IT = new ProtoBlock(shaperIT, piecerIT);

	
	
	public int shape[][];

	int pieces[][];

	int id;

	private ProtoBlock(int shape[][], int pieces[][]) {
		this.shape = shape;
		// this.type=type;
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < shape[i].length; j++) {
				shape[i][j] *= edge;
			}
		}
		this.pieces = pieces;
		id = typeCount++;
	}
//
//	void findPoly() {
//		int maxX=Integer.MIN_VALUE;
//		int maxY=Integer.MIN_VALUE;
//		int minX=Integer.MAX_VALUE;
//		int minY=Integer.MAX_VALUE;
//		
//		Set<Point> realPts=new HashSet<Point>();
//		
//		for (int [] p:pieces) {
//			if (p[0] > maxX) maxX=p[0];
//			if (p[1] > maxY) maxY=p[1];
//			if (p[0] < minX) minX=p[0];
//			if (p[1] < minY) minY=p[1];
//			realPts.add(new Point(p[0],p[1]));
//			realPts.add(new Point(p[0]+1,p[1]));
//			realPts.add(new Point(p[0]+1,p[1]+1));
//			realPts.add(new Point(p[0],p[1]+1));
//		}
//		
//		
//		int w=maxX-minX+1;
//		int h=maxY-minY+1;
//		
//		int nPoint= (w + h) *2;
//		
//		class MyVector<T> extends Vector<T> {
//			T next(T o) {
//				int i=indexOf(o);
//				if (i < size()-1 ) return get(i+1);
//				return get(0);
//			}
//			T prev(T o) {
//				int i=indexOf(o);
//				if (i > 0  ) return get(i -1);
//				return get(size()-1);
//			}
//
//		}
//		
//		MyVector<Point> poly=new MyVector<Point>();
//		
//		for (int i=minX;i<maxX;i++) {
//			poly.add(new Point(i,minY));
//		}
//
//		for (int i=minY;i<maxY;i++) {
//			poly.add(new Point(maxX,i));
//		}
//
//		for (int i=maxX;i>minX;i--) {
//			poly.add(new Point(i,maxY));
//		}
//
//		for (int i=maxY;i>minX;i--) {
//			poly.add(new Point(minX,i));
//		}
//
//		for (Point p:poly) {
//			if (realPts.contains(p)) continue;
//			Point nxt=poly.next(p);
//			Point prv=poly.prev(p);
//			if (realPts.contains(p)) {
//				int dx=nxt.x - prv.x;
//				int dy=nxt.y - prv.y;
//			}
//			
//		}
//		
//		
//		
//	}
}
